﻿<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxml="urn:schemas-microsoft-com:xslt" xmlns:xapi="urn:xapi" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl msxml xapi">

  <msxml:script implements-prefix="xapi" language="C#">
    <![CDATA[
public string escapeWikiLink(string input)
        {
            input = input.Replace('`', '_');
            Regex r = new Regex(@"\b[A-Z][a-z\d]+([A-Z][a-z\d]+)+\b");
            return r.Replace(input, new MatchEvaluator(m => string.Concat("!", m.Value)));
        }
]]>
  </msxml:script>


  <!--COMMENTS AS H1-->
  <xsl:template match="comments" mode="h1">
    <xsl:if test="summary">
      <xsl:text>= Summary =
</xsl:text>
      <xsl:apply-templates mode="comments" select="summary" />
    </xsl:if>
    <xsl:if test="remarks">
      <xsl:text>= Remarks =
</xsl:text>
      <xsl:apply-templates mode="comments" select="remarks" />
    </xsl:if>
    <xsl:if test="example">
      <xsl:text>= Example</xsl:text>
      <xsl:if test="not(count(example)=1)">
        <xsl:text>s</xsl:text>
      </xsl:if>
      <xsl:text> =
</xsl:text>
      <xsl:apply-templates select="example" />
    </xsl:if>
  </xsl:template>

  <!--COMMENTS AS H3-->
  <xsl:template match="comments" mode="h4">
    <xsl:if test="summary">
      <xsl:apply-templates mode="comments" select="summary" />
    </xsl:if>
    <xsl:if test="remarks">
      <xsl:text>==== Remarks ====
</xsl:text>
      <xsl:apply-templates mode="comments" select="remarks" />
    </xsl:if>
    <xsl:if test="returns">
      <xsl:text>==== Returns ====
</xsl:text>
      <xsl:apply-templates mode="comments" select="returns" />
    </xsl:if>
    <xsl:if test="example">
      <xsl:text>==== Example</xsl:text>
      <xsl:if test="not(count(example)=1)">
        <xsl:text>s</xsl:text>
      </xsl:if>
      <xsl:text> ====
</xsl:text>
      <xsl:apply-templates select="example" />
    </xsl:if>
  </xsl:template>

  <!--COMMENTS AS H5-->
  <xsl:template match="comments" mode="h5">
    <xsl:if test="summary">
      <xsl:apply-templates mode="comments" select="summary" />
    </xsl:if>
    <xsl:if test="remarks">
      <xsl:text>===== Remarks =====
</xsl:text>
      <xsl:apply-templates mode="comments" select="remarks" />
    </xsl:if>
    <xsl:if test="returns">
      <xsl:text>===== Returns =====
</xsl:text>
      <xsl:apply-templates mode="comments" select="returns" />
    </xsl:if>
    <xsl:if test="example">
      <xsl:text>===== Example</xsl:text>
      <xsl:if test="not(count(example)=1)">
        <xsl:text>s</xsl:text>
      </xsl:if>
      <xsl:text> =====
</xsl:text>
      <xsl:apply-templates select="example" />
    </xsl:if>
  </xsl:template>

  <xsl:template match="summary" mode="comments">
    <xsl:apply-templates mode="comments" select="child::node()" />
    <xsl:text>
</xsl:text>
  </xsl:template>

  <xsl:template match="returns" mode="comments">
    <xsl:apply-templates mode="comments" select="child::node()" />
    <xsl:text>
</xsl:text>
  </xsl:template>

  <xsl:template match="remarks" mode="comments">
    <xsl:apply-templates mode="comments" select="child::node()" />
    <xsl:text>
</xsl:text>
  </xsl:template>

  <xsl:template match="example">
    <xsl:value-of select="normalize-space(.)"/>
  </xsl:template>

  <!--OUTPUT TEXT BLOCKS-->
  <xsl:template mode="comments" match="text()" priority="2">
    <xsl:value-of select="normalize-space(.)"/>
  </xsl:template>

  <xsl:template mode="comments" match="c">
    <xsl:text>`</xsl:text>
    <xsl:apply-templates mode="comments" select="child::node()" />
    <xsl:text>`</xsl:text>
  </xsl:template>

  <xsl:template mode="comments" match="pre" priority="2">
    <xsl:text><![CDATA[<pre>]]></xsl:text>
    <xsl:copy-of select="child::node()" />
    <xsl:text><![CDATA[</pre>]]></xsl:text>
  </xsl:template>

  <xsl:template mode="comments" match="example">
    <xsl:choose>
      <xsl:when test="@caption">
        <xsl:text>

* Example: *</xsl:text>
      <xsl:value-of select="normalize-space(@caption)"/>
        <xsl:text>
</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>

* Example *
 </xsl:text>
      </xsl:otherwise>
    </xsl:choose>
    <xsl:apply-templates mode="example" select="child::node()" />
  </xsl:template>

  <xsl:template mode="example" match="code">
    <xsl:text>
{{{</xsl:text>
    <xsl:copy-of select="child::node()" />
    <xsl:text>}}}
</xsl:text>
  </xsl:template>
  
  <xsl:template mode="example" match="text()">
    <xsl:copy/>
  </xsl:template>

  <xsl:template mode="example" match="*">
    <xsl:text><![CDATA[<]]></xsl:text>
    <xsl:value-of select="name()"/>
    <xsl:text><![CDATA[>]]></xsl:text>
    <xsl:apply-templates mode="comments" select="child::node()" />
    <xsl:text><![CDATA[</]]></xsl:text>
    <xsl:value-of select="name()"/>
    <xsl:text><![CDATA[>]]></xsl:text>
  </xsl:template>

  <xsl:template mode="comments" match="code">
    <xsl:text>
{{{</xsl:text>
    <xsl:copy-of select="child::node()" />
    <xsl:text>}}}
</xsl:text>
  </xsl:template>

  <xsl:template mode="comments" match="see|seealso">
    <xsl:text> [</xsl:text>
    <xsl:value-of select="@wikiLink"/>
    <xsl:text> </xsl:text>
    <xsl:choose>
      <xsl:when test="text()">
        <xsl:value-of select="text()"/>
      </xsl:when>
      <xsl:when test="@caption">
        <xsl:value-of select="@caption"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="@cref"/>
      </xsl:otherwise>
    </xsl:choose>
    <xsl:text>] </xsl:text>
  </xsl:template>

  <xsl:template mode="example" match="see|seealso">
    <xsl:text> [</xsl:text>
    <xsl:value-of select="@wikiLink"/>
    <xsl:text> </xsl:text>
    <xsl:choose>
      <xsl:when test="text()">
        <xsl:value-of select="text()"/>
      </xsl:when>
      <xsl:when test="@caption">
        <xsl:value-of select="@caption"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="@cref"/>
      </xsl:otherwise>
    </xsl:choose>
    <xsl:text>] </xsl:text>
  </xsl:template>

  <!--PASS THROUGH UNKNOWN ELEMENTS-->
  <xsl:template mode="comments" match="*">
    <xsl:text><![CDATA[<]]></xsl:text>
    <xsl:value-of select="name()"/>
    <xsl:text><![CDATA[>]]></xsl:text>
    <xsl:apply-templates mode="comments" select="child::node()" />
    <xsl:text><![CDATA[</]]></xsl:text>
    <xsl:value-of select="name()"/>
    <xsl:text><![CDATA[>]]></xsl:text>
  </xsl:template>


  <!--SINGLELINE-->
  <xsl:template match="summary" mode="singleLine">
    <xsl:apply-templates mode="singleLine" select="child::node()" />
  </xsl:template>

  <xsl:template match="returns" mode="singleLine">
    <xsl:apply-templates mode="comments" select="child::node()" />
  </xsl:template>

  <xsl:template match="remarks" mode="singleLine">
    <xsl:apply-templates mode="comments" select="child::node()" />
  </xsl:template>

  <xsl:template mode="singleLine" match="text()" priority="2">
    <xsl:value-of select="normalize-space(.)"/>
  </xsl:template>

  <xsl:template mode="singleLine" match="c">
    <xsl:text>`</xsl:text>
    <xsl:apply-templates mode="comments" select="child::node()" />
    <xsl:text>`</xsl:text>
  </xsl:template>

  <xsl:template mode="singleLine" match="see|seealso">
    <xsl:text> [</xsl:text>
    <xsl:value-of select="@wikiLink"/>
    <xsl:text> </xsl:text>
    <xsl:choose>
      <xsl:when test="text()">
        <xsl:value-of select="text()"/>
      </xsl:when>
      <xsl:when test="@caption">
        <xsl:value-of select="@caption"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="@cref"/>
      </xsl:otherwise>
    </xsl:choose>
    <xsl:text>] </xsl:text>
  </xsl:template>

  <xsl:template mode="singleLine" match="*">
    <xsl:text><![CDATA[<]]></xsl:text>
    <xsl:value-of select="name()"/>
    <xsl:text><![CDATA[>]]></xsl:text>
    <xsl:apply-templates mode="comments" select="child::node()" />
    <xsl:text><![CDATA[</]]></xsl:text>
    <xsl:value-of select="name()"/>
    <xsl:text><![CDATA[>]]></xsl:text>
  </xsl:template>

</xsl:stylesheet>
